home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / ISO_SRC.ZIP / LIBRARY.ZIP / PCX.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-27  |  3.4 KB  |  149 lines

  1. /*
  2.   Will read in a 320x200x256c pcx file
  3.  
  4.   These functions will work regardless of COMPILER_ setting
  5. */
  6.  
  7. #define BYTEMODE 0
  8. #define RUNMODE  1
  9. #define BUFLEN 1000
  10. #define IMAGESIZE 64000L
  11.  
  12. char pcx_load(char *name,char *buf,char *pal);
  13. char pcx_save(char *name,char *buf,char *pal);
  14.  
  15. typedef struct {
  16.   char manufacturer;
  17.   char version;
  18.   char encoding;
  19.   char bits_per_pixel;
  20.   signed short int xmin,ymin;
  21.   signed short int xmax,ymax;
  22.   signed short int hres,vres;
  23.   char palette16[48];
  24.   char reserved;
  25.   char color_planes;
  26.   signed short int bytes_per_line;
  27.   signed short int palette_type;
  28.   char filler[58];
  29. } PCX_HEADER;
  30.  
  31. char pcx_load(char *name,char *buf,char *pal)
  32. {
  33.   FILE *fp;
  34.   signed short int mode,readlen,bufptr;
  35.   char outbyte,bytecount,buffer[BUFLEN];
  36.   long i;
  37.  
  38.   if((fp=fopen(name,"rb"))==NULL)
  39.     return(0);
  40.  
  41.   if(buf!=NULL) {
  42.  
  43.     // Skip past the header
  44.     fseek(fp,128L,SEEK_SET);
  45.  
  46.     // Read in the image
  47.     mode=BYTEMODE;
  48.     bufptr=0;
  49.     readlen=0;
  50.     for(i=0;i<IMAGESIZE;i++) {
  51.       if(mode==BYTEMODE) {
  52.         if(bufptr>=readlen) {
  53.           bufptr=0;
  54.           if((readlen=fread(buffer,1,BUFLEN,fp))==0)
  55.             break;
  56.         }
  57.         outbyte=buffer[bufptr++];
  58.         if(outbyte>0xbf) {
  59.           bytecount=(signed short int)((signed short int)outbyte&0x3f);
  60.           if(bufptr>=readlen) {
  61.             bufptr=0;
  62.             if((readlen=fread(buffer,1,BUFLEN,fp))==0)
  63.               break;
  64.           }
  65.           outbyte=buffer[bufptr++];
  66.           if(--bytecount>0)
  67.             mode=RUNMODE;
  68.         }
  69.       } else if(--bytecount==0)
  70.         mode=BYTEMODE;
  71.       *buf++=outbyte;
  72.     }
  73.   }
  74.  
  75.   // Read in palette
  76.   if(pal!=NULL) {
  77.     fseek(fp,-768L,SEEK_END);
  78.     fread(pal,1,768,fp);
  79.   }
  80.   fclose(fp);
  81.  
  82.   return(1);
  83. }
  84.  
  85. char pcx_save(char *name,char *buf,char *pal)
  86. {
  87.   FILE *fp;
  88.   signed short int i,j,t;
  89.   signed short int vseg,voff;
  90.   char *ptr,tpal[768];
  91.   PCX_HEADER header= { 10,5,1,8,0,0,319,199,320,200,
  92.                        0,0,0,0,0,0xaa,0,0xaa,0,0,0xaa,0xaa,0xaa,0,0,0xaa,
  93.                        0,0xaa,0xaa,0x55,0,0xaa,0xaa,0xaa,0x55,0x55,0x55,0x55,0x55,0xff,0x55,0xff,
  94.                        0x55,0x55,0xff,0xff,0xff,0x55,0x55,0xff,0x55,0xff,0xff,0xff,0x55,0xff,0xff,0xff,
  95.                        0,1,320,0,
  96.                        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  97.                        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
  98.  
  99.   if(pal==NULL) {
  100.     for(i=0;i<256;i++) {
  101.       outp(0x3c7,i);
  102.       tpal[i*3] = inp(0x3c9) <<2;
  103.       tpal[i*3+1] = inp(0x3c9)<<2;
  104.       tpal[i*3+2] = inp(0x3c9)<<2;
  105.     }
  106.   } else memcpy(tpal,pal,768);
  107.  
  108.   // open the file
  109.   if((fp=fopen(name,"wb"))==NULL)
  110.     return(0);
  111.  
  112.   // write the header
  113.   fwrite(&header,1,sizeof(PCX_HEADER),fp);
  114.  
  115.   // encode the image
  116.   i=0;
  117.   t=0;
  118.   for(j=0;j<200;j++) {
  119.     ptr=&buf[320*j];
  120.     t=0;
  121.     do {
  122.       i=0;
  123.       while((ptr[t+i]==ptr[t+i+1]) && ((t+i)<320) && (i<63))
  124.         i++;
  125.       if(i>0) {
  126.         fputc(i | 0xc0,fp);
  127.         fputc(ptr[t],fp);
  128.         t+=i;
  129.       } else {
  130.         if(((ptr[t]) & 0xc0)==0xc0)
  131.           fputc(0xc1,fp);
  132.         fputc(ptr[t++],fp);
  133.       }
  134.     } while(t<320);
  135.   }
  136.  
  137.   //?? palette sig?
  138.   fputc(0x0c,fp);
  139.  
  140.   // write the palette
  141.   fwrite(tpal,1,768,fp);
  142.  
  143.   // close the file
  144.   fclose(fp);
  145.  
  146.   // return ok
  147.   return(1);
  148. }
  149.